<?php


namespace App\Common\lib;

use App\Exception\ApiException;
use EasySwoole\Jwt\Jwt as JwtClass;
use EasySwoole\EasySwoole\Config as GlobalConfig;

class Jwt
{
    static $time = 86400;
    static $iss = 'easyswoole';
    static $sub = '主题';

    /**
     * 获取配置信息
     * @return array|mixed|null
     */
    public static function getConf()
    {
        return GlobalConfig::getInstance()->getConf("SecretKey");;
    }

    /**
     * 生成token
     * @param null $openid
     * @return mixed
     */
    public static function createToken($openid = null)
    {
        $jwtObject = JwtClass::getInstance()->setSecretKey(self::getConf())->publish();
        $jwtObject->setAlg('HMACSHA256'); // 加密方式
        $jwtObject->setAud($openid); // 用户
        $jwtObject->setExp(time() + self::$time); // 过期时间
        $jwtObject->setIat(time()); // 发布时间
        $jwtObject->setIss(self::$iss); // 发行人
        $jwtObject->setJti(md5(time())); // jwt id 用于标识该jwt
        $jwtObject->setNbf(time() + 60 * 5); // 在此之前不可用
        $jwtObject->setSub(self::$sub); // 主题
        // 自定义数据
        $jwtObject->setData(['other_info']);
        // 最终生成的token
        return $jwtObject->__toString();
    }

    /**
     * 检测token
     * @param string $token
     * @return bool
     * @throws ApiException
     */
    public static function checkToken($token = '')
    {
        try {
            $jwtObject = JwtClass::getInstance()->setSecretKey(self::getConf())->decode($token);
            $status = $jwtObject->getStatus();
            switch ($status) {
                case  1:
//                    echo '验证通过';
                    return 1;
                    $jwtObject->getAlg();
                    $jwtObject->getAud();
                    $jwtObject->getData();
                    $jwtObject->getExp();
                    $jwtObject->getIat();
                    $jwtObject->getIss();
                    $jwtObject->getNbf();
                    $jwtObject->getJti();
                    $jwtObject->getSub();
                    $jwtObject->getSignature();
                    $jwtObject->getProperty('alg');
                    break;
                case  -1:
//                    echo '无效';
                    return 2;
                    break;
                case  -2:
                    return 3;
//                    echo 'token过期';
                    break;
            }
        } catch (\EasySwoole\Jwt\Exception $e) {
            throw new ApiException("请先登录",Code::$error);
        }
    }
}